csvqを使ってVimの中で簡易SQLを使えるようにしてみた
はじめに
こんにちは、平野です。
データベースに入っていないcsvデータに対して手元でSQLを実行するアプリとしてcsvqがあります。 小さなデータでの確認など色々と重宝しています。 今回はこれをVimのバッファにあるデータに対して実行することでちょっとだけラクできるようなプラグインを作ってみました。
なお、今回は複数テーブルのことは一切忘れております。 csvq自体は複数テーブルにも対応しているので、いずれ対応できればとも思いますが、 まずは単一テーブルの操作に限定しています。
使い方
実行前
Vimで以下のように、クエリとデータを用意します。
(実際に実行する場合は#
以降の文章を削除してください)
-- -d '\t' # 先頭の"-- "の後にcsvqのオプションを書く select * where colA = 'reiwa' # SQL文を書く。fromは書かない ;------------ # 最後の";"の次の行以降をデータとみなす colA colB colC heisei 31 2019-04-30 reiwa 1 2019-05-01
この状態で、クエリが書いてある行でF8
(後述のように、好きにキーバインドを設定してください)を押すとクエリが実行されます。
SQLで注意するべき点としては、from
が不要となっています。
csvqではfrom
が省略された時には標準入力がデータの入力となるので、それを利用しています。
普段SQLを書き慣れている人には逆に違和感があるかもしれませんがご了承ください。
ファイル先頭には-- (CSVのオプション文字列)
を書くことができるので適宜設定してください。
今回はデータがタブ区切りになっているので、csvqのオプションとして-d '\t'
を指定しています。
なお、SQL文を書く部分とデータの部分とを別のウィンドウにしたいという気持ちもあったのですが、 簡単にすぐできる方法ということで、同一ウィンドウ内で処理するようにしてしまいました。 しかし使ってみると、単純に一つのテキストファイルとして保存できるなどのメリットがあり、 この形態が一番よかったように思います。
実行後
データの部分がcsvqによって処理された文字列に置き換えられます。 データよりも上の部分はそのまま残ります。
-- -d '\t' # 先頭の"-- "の後にcsvqのオプションを書く select * where colA = 'reiwa' # SQL文を書く。fromは書かない ;------------ # 最後の";"の次の行以降をデータとみなす +--------+------+------------+ | colA | colB | colC | +--------+------+------------+ | reiwa | 1 | 2019-05-01 | +--------+------+------------+
処理自体はcsvqに丸投げしているだけなので、もちろんもっと複雑なこともできます。
便利なポイント
- Undo
- csvqを使った処理はVim的には1回の変更として扱われるため、
u
で処理前に戻すことができます。
- csvqを使った処理はVim的には1回の変更として扱われるため、
- 出力を次の入力に
- csvqのオプションで
-f TSV
を指定すれば処理結果がtsvになるので、続けて別のクエリの実行が可能に。
- csvqのオプションで
インストール
csvq
まずはcsvqがPATHが通っている場所に配置され、csvq
だけで起動するようになっている必要があります。
csvqのインストールに関しては下記ブログをご参照ください。 私もこの記事でcsvqの存在を知りました!ご紹介ありがとうございます!
配布場所
https://github.com/cm-hirano-shigetoshi/vim-csvq
インストール方法
普通にプラグインをインストールする方法でOKです。
標準のパッケージ機能を使う場合は
~/.vim/pack/master/start
の下などに置いてください。 詳細については以下のページが非常に詳しいので是が非でも参照して下さい。
キーバインド設定
上記方法でインストールしただけでは特にキーバインドは設定されていません。
.vimrc
に自分でキーバインドを設定する必要があります。
例えばF8
に設定する場合は以下を.vimrc
に書きます。
nmap <F8> <Plug>(CSVQ)
まとめ
Vimのバッファ内のデータをSQLで簡単に集計するプラグインを作って見ました。 よく考えたら、別にSQLに限らず、シェルのコマンドを動作させる方が汎用性があることに気づいてしまったのですが、 SQLのクエリを書くだけの方がSQLクライアントアプリっぽくていいかな、とも思っています。
もともとは工数を管理するメモ書きを作っていて、 日付やプロジェクトコードごとに集計したいと思ったのが作ったきっかけです。 稼働時間やら工数を書いたデータを下部に書き、上部によく使うクエリをいくつか書いた形で保存しています。 工数を別の場所に入力する時には適宜クエリを実行して数値の確認などを行うことができます。
ざっと作った荒削りな出来栄えなので、好みに応じて改良して使って頂ければと思います。